/**
 * @file main.cpp
 * @brief FFT音乐频谱灯主程序
 * @version 1.0
 * @author Craft
 */

#include <Arduino.h>
#include "driver/i2s.h"
#include "../include/config.h"
#include "../include/i2sfft.h" // 修正路径
#include "../include/led.h"
#include "../include/buttons.h"
#include "../include/display.h"
#include "../include/menu.h"
#include "../include/debug.h"
#include "../include/mcu_led.h" // 添加MCU LED头文件
#include "../include/ir_receiver.h" // 添加红外接收器头文件

// I2SFFTProcessor音频处理对象
I2SFFTProcessor *i2sFftProcessor = nullptr; // 定义全局变量

// 音频数据缓冲区(静态分配确保内存安全)
static float audioBuffer[AUDIO_BUFFER_SIZE] = {0};

// 当前音量
static float currentVolume = 0.0;
extern bool g_sampleStatus; // 采样状态标志

// 噪声检测状态
static bool noiseDetectionRunning = false;
static uint32_t lastNoiseDetectionTime = 0;
static float lastNoiseLevel = 0.0f;

// 将 fftBuffer 移到全局作用域
static double fftBuffer[SAMPLES] = {0};
static double leftBuffer[32] = {0};
static double rightBuffer[32] = {0};

// 重启计数器
RTC_DATA_ATTR uint32_t restartCount = 0;

// 缓冲区安全检查函数
inline bool isBufferValid(const float *buf, size_t size)
{
    return buf != nullptr && size > 0 && size <= AUDIO_BUFFER_SIZE;
}

// RMS计算函数
float calculateRMS(float *buffer, int size)
{
    float sum = 0.0f;
    for (int i = 0; i < size; i++)
    {
        sum += buffer[i] * buffer[i];
    }
    return sqrt(sum / size);
}

// 重启标志，用于检测是否刚刚重启
bool justRestarted = false;
/**
 * @brief 初始化所有模块
 *
 * @return true 初始化成功
 * @return false 初始化失败
 */
bool initAll()
{
    // 初始化串口（调试用）
    if (DEBUG_SERIAL)
    {
        Serial.begin(115200);
    }

    // 初始化调试系统
    initDebug();

    // 输出启动信息
    Serial.println("FFT音乐频谱灯启动中...");

    // 初始化存储系统
    if (!initStorage())
    {
        logError("存储系统初始化失败!");
        return false;
    }

    // 加载配置
    if (!loadConfig())
    {
        logWarning("配置加载失败，使用默认配置");
        resetConfig();
        // 保存默认配置到Preferences存储，确保下次启动能正常加载
        if (saveConfig())
        {
            logInfo("默认配置已保存到Preferences存储");
        }
        else
        {
            logError("默认配置保存失败");
        }
    }
    else
    {
        logInfo("配置加载成功");
        logInfo("噪声检查状态: %s", g_config.noiseCheckEnabled ? "启用" : "禁用");
    }

    // 初始化OLED显示屏
    if (!initDisplay())
    {
        logWarning("OLED显示屏初始化失败，但不影响主要功能");
        // 不返回false，允许系统继续运行
    }
    else
    {
        logInfo("OLED显示屏初始化成功");
    }

    // 初始化按钮
    initButtons();

    // 初始化MCU状态LED（在其他模块之前初始化，避免冲突）
    if (!initMCULED())
    {
        logWarning("MCU状态LED初始化失败，但不影响主要功能");
        // 不返回false，因为状态LED失败不应阻止系统启动
    }
    else
    {
        logInfo("MCU状态LED初始化成功");
        // 启动低功耗状态的循环闪烁
        setMCULEDLowPowerStatus();
        logInfo("MCU LED开始2秒循环闪烁 (亮0.1秒/熄灭1.9秒)");
    }

    // 初始化 I2SFFTProcessor
    i2sFftProcessor = new I2SFFTProcessor(SAMPLES);
    // 将 initializeAsSlave 替换为 initialize
    if (!i2sFftProcessor->initialize())
    {
        logError("I2SFFTProcessor 初始化失败!");
        return false;
    }

    // 初始化LED灯带和效果(传递audioInput)
    if (!initLEDEffects())
    {
        logError("LED效果初始化失败!");
        return false;
    }
    else
    {
        logInfo("LED效果初始化成功");
    }

    // 初始化菜单系统
    initMenu();

    // 初始化红外接收器
    g_irReceiver.begin();
    logInfo("红外接收器初始化成功");

    return true;
}

/**
 * @brief 更新显示和效果
 */
void updateDisplayAndEffects()
{
    // ==================== 优化时序控制 ====================
    static uint32_t lastLEDUpdateTime = 0;
    static uint32_t lastNoiseUpdateTime = 0;
    uint32_t currentTime = millis();

    // LED效果更新 - 提高更新频率以配合平滑算法
    if (currentTime - lastLEDUpdateTime >= 2)
    { // 约60Hz更新频率，配合平滑算法
        if (i2sFftProcessor == nullptr)
        {
            logError("i2sFftProcessor 未初始化，跳过 LED 效果更新");
        }
        else
        {
            updateLEDEffects(currentVolume);
        }
        lastLEDUpdateTime = currentTime;
    }

    // 获取当前页面
    DisplayPage currentPage = getCurrentPage();

    if (currentPage == PAGE_MAIN)
    {
        // 噪声检测更新 - 保持较低频率避免影响音频处理
        if (!noiseDetectionRunning && currentTime - lastNoiseUpdateTime >= 200)
        {
            if (i2sFftProcessor == nullptr)
            {
                logError("i2sFftProcessor 未初始化，无法启动噪声检测");
            }
            else if (i2sFftProcessor->isBufferReady())
            {
                try
                {
                    if (i2sFftProcessor->startNoiseDetection())
                    {
                        noiseDetectionRunning = true;
                    }
                }
                catch (const std::exception &e)
                {
                    logError("噪声检测启动失败: %s", e.what());
                    noiseDetectionRunning = false;
                    lastNoiseUpdateTime = currentTime;
                }
            }
        }

        // 噪声检测处理
        if (noiseDetectionRunning)
        {
            try
            {
                if (i2sFftProcessor->updateNoiseDetection())
                {
                    noiseDetectionRunning = false;
                    lastNoiseUpdateTime = currentTime;
                    float noiseLevel = i2sFftProcessor->getNoiseLevel();
                    if (noiseLevel >= 0 && noiseLevel <= 1.0)
                    {
                        lastNoiseLevel = noiseLevel;
                    }
                    else
                    {
                        lastNoiseLevel = 0;
                        logError("噪声级别超出范围: %.2f", noiseLevel);
                    }
                }
            }
            catch (const std::exception &e)
            {
                logError("噪声检测更新失败: %s", e.what());
                noiseDetectionRunning = false;
                lastNoiseUpdateTime = currentTime;
            }
        }

        // 显示更新 - 保持较低频率，避免显示闪烁
        static uint32_t lastDisplayTime = 0;
        if (currentTime - lastDisplayTime >= 100)
        { // 10Hz显示更新
            if (g_displayInitialized)
            {
                showMainPage(currentVolume * 100, lastNoiseLevel);
            }
            lastDisplayTime = currentTime;
        }
    }
}

/**
 * @brief Arduino setup函数
 */
void setup()
{
    // 增加重启计数器
    restartCount++;
    // 设置重启标志
    justRestarted = true;

    // 初始化所有模块
    if (!initAll())
    {
        // 初始化失败，显示错误信息
        logError("初始化失败，系统停止!");
        while (1)
            ; // 停止执行
    }

    // 显示启动完成信息
    logInfo("FFT音乐频谱灯启动完成!");
}

// 按钮引脚数组
const uint8_t buttonPins[] = {
    BUTTON_MODE_PIN,
    BUTTON_UP_PIN,
    BUTTON_DOWN_PIN,
    BUTTON_ENTER_PIN};

/**
 * @brief Arduino loop函数
 */
// 大幅增加任务栈大小
#define MAIN_TASK_STACK_SIZE 32768 // 增加到32KB
// 上次更新时间
uint32_t lastUpdateTime = 0;
uint32_t lastDisplayUpdateTime = 0;
uint32_t lastRainbowCheckTime = 0;

void loop()
{
    static uint32_t loopCount = 0;
    static uint32_t lastLoopTime = 0;
    static uint32_t lastLogTime = 0; // 用于控制日志输出的时间间隔
    uint32_t currentTime = millis();

    // 检查红外信号
    if (g_irReceiver.hasSignal())
    {
        unsigned long code = g_irReceiver.getCode();
        g_irReceiver.executeCommand(code);
    }

    // 每2分钟检查 rainbowDirection，如果等于9则随机生成0-8的值
    uint32_t colorTimeDiff = (currentTime >= lastRainbowCheckTime) ? (currentTime - lastRainbowCheckTime) : (0xFFFFFFFF - lastRainbowCheckTime + currentTime + 1);
    if (colorTimeDiff >= 120000) // 2分钟 = 120000毫秒
    {
        if (g_config.rainbowDirection == 0)
        {
            currentRainbowDirection = random(1, 10); // 随机生成1-9的值
            // Serial.println("开始更新彩虹方向到: " + String(currentRainbowDirection));
        }
        lastRainbowCheckTime = currentTime;
    }

    // 确保稳定的帧率(20Hz)
    if (currentTime - lastLoopTime < 50)
    {
        delay(1);
        return;
    }
    lastLoopTime = currentTime;

    uint32_t audioTimeDiff = (currentTime >= lastUpdateTime) ? (currentTime - lastUpdateTime) : (0xFFFFFFFF - lastUpdateTime + currentTime + 1);
    if (audioTimeDiff >= 10) // 每10ms更新一次音频数据
    {
        DEBUG_MAIN_PRINTLN("======== 音频更新周期开始 ========");
        updateButtons();
        DEBUG_MAIN_PRINTLN("*** 按钮状态更新完成 ***");
        updateMenu();
        DEBUG_MAIN_PRINTLN("*** 菜单状态更新完成 ***");

        lastUpdateTime = currentTime;
    }

    uint32_t displayTimeDiff = (currentTime >= lastDisplayUpdateTime) ? (currentTime - lastDisplayUpdateTime) : (0xFFFFFFFF - lastDisplayUpdateTime + currentTime + 1);
    if (displayTimeDiff >= 33) // 改为30FPS更新频率 (每33ms更新一次)，提供更平滑的视觉效果
    {
        DEBUG_MAIN_PRINTLN("======== 显示更新周期开始 ========");
        updateDisplayAndEffects();
        DEBUG_MAIN_PRINTLN("*** 显示和效果更新完成 ***");
        lastDisplayUpdateTime = currentTime;
    }

    // 更新MCU状态LED
    updateMCULED();
}